/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.vue.jsf.converter;

import javax.ejb.EJB;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import net.etrs.formathlon.entity.utilisateur.Utilisateur;
import net.etrs.formathlon.persistance.utilisateur.PersonnelFacade;
import net.etrs.formathlon.persistance.utilisateur.UtilisateurFacade;

/**
 * Converter utilisé pour la gestion des Utilisateurs.
 * Il va aussi apporter une sécurité des liens en
 * envoyant à la page
 * @author OPIF
 */
@ManagedBean
@ApplicationScoped
public class UtilisateurConverter extends GenericConverter {

    @EJB
    UtilisateurFacade utilisateurFacade;
    @EJB
    PersonnelFacade personneFacade;

    /**
     * Méthode du converter qui va renvoyer un utilisateur soit existant en base
     * soit nouvellement créé pour l'initialisation du formulaiure jsf.
     * @param context
     * @param component
     * @param value identifiant de l'utilisateur
     * @return L'utilisateur
     */
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Utilisateur u;
        try {
            // En cas d'erreur, la value n'est pas de type long.
            long idUtil = Integer.parseInt(value);
            // Recherche en base avec l'identifiant
            u = utilisateurFacade.read(idUtil);
            // S'il n'existe pas d'utilisateur avec cet identifiant, le read
            // renvoi null et donc on crée une nouvelle instance sinon jsf renvera
            // une nullpointerexeption.
            if (u == null) {
                u = utilisateurFacade.newInstance();
            } else {
                // On teste si l'utilisateur a un personnel(participant à des 
                // formations) associé car pour la même raison, il est nécessaire
                // d'en avoir un pour le stockage des données jsf.
                // De plus on va se servir de lui pour initialiser l'affichage ou
                // non des infomations de l'utilisateur.
                if (u.getPersonnel() == null) {
                    u.setPersonnel(personneFacade.newInstance());
                }
            }
        } catch (Exception e) {
            u = utilisateurFacade.newInstance();
        }
        return u;
    }

    /**
     * Méthode inverse qui va renvoyer l'identifiant sous forme de string 
     * d'un utilisateur
     * @param context
     * @param component
     * @param value
     * @return La value pour l'utilisateur
     */
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return ((Utilisateur) value).getId()+"";
    }

    // GETTER et SETTER

    public PersonnelFacade getPersonneFacade() {
        return personneFacade;
    }

    public void setPersonneFacade(PersonnelFacade personneFacade) {
        this.personneFacade = personneFacade;
    }

    public UtilisateurFacade getUtilisateurFacade() {
        return utilisateurFacade;
    }

    public void setUtilisateurFacade(UtilisateurFacade utilisateurFacade) {
        this.utilisateurFacade = utilisateurFacade;
    }
}
